package com.sh.rpc.protocol;


import com.sh.rpc.serializer.Serializer;
import com.sh.rpc.serializer.SerializerFactory;
import io.vertx.core.buffer.Buffer;

/**
 * 我的tcp协议编码器
 *
 * @author sh
 */
public class ProtocolMessageEncoder {

    // 编码
    public static Buffer encode(ProtocolMessage<?> protocolMessage) throws Exception {
        // 如果协议消息为空，或者头部为空，则返回空的缓冲区
        if ( protocolMessage==null || protocolMessage.getHeader()==null){
            return Buffer.buffer();
        }

        // 依次进入缓冲区
        ProtocolMessage.Header header = protocolMessage.getHeader();
        Buffer buffer = Buffer.buffer();
        buffer.appendByte(header.getMagic());  // 魔数
        buffer.appendByte(header.getVersion());  // 版本
        buffer.appendByte(header.getSerializer());  // 序列化方式
        buffer.appendByte(header.getType());  // 消息类型
        buffer.appendByte(header.getStatus());  // 状态码
        buffer.appendLong(header.getRequestId());  // 请求id

        // 序列化消息体
        ProtocolMessageSerializerEnum serializerEnum = ProtocolMessageSerializerEnum.getEnumByKey(header.getSerializer());
        if (serializerEnum==null){
            throw new RuntimeException("未知的序列化方式");
        }
                                           // jdk json、、
        Serializer serializer = SerializerFactory.getInstance(serializerEnum.getValue());
        byte[] bodyBytes = serializer.serialize(protocolMessage.getBody());// 序列化消息体
        // 写入消息体长度
        buffer.appendInt(bodyBytes.length);
        // 写入消息体  private T body;
        buffer.appendBytes(bodyBytes);
        return buffer;
    }
}
